"""
2683. 相邻值的按位异或
中等
相关标签
premium lock icon
相关企业
提示
下标从 0 开始、长度为 n 的数组 derived 是由同样长度为 n 的原始 二进制数组 original 通过计算相邻值的 按位异或（⊕）派生而来。

特别地，对于范围 [0, n - 1] 内的每个下标 i ：

如果 i = n - 1 ，那么 derived[i] = original[i] ⊕ original[0]
否则 derived[i] = original[i] ⊕ original[i + 1]
给你一个数组 derived ，请判断是否存在一个能够派生得到 derived 的 有效原始二进制数组 original 。

如果存在满足要求的原始二进制数组，返回 true ；否则，返回 false 。

二进制数组是仅由 0 和 1 组成的数组。


示例 1：

输入：derived = [1,1,0]
输出：true
解释：能够派生得到 [1,1,0] 的有效原始二进制数组是 [0,1,0] ：
derived[0] = original[0] ⊕ original[1] = 0 ⊕ 1 = 1
derived[1] = original[1] ⊕ original[2] = 1 ⊕ 0 = 1
derived[2] = original[2] ⊕ original[0] = 0 ⊕ 0 = 0
示例 2：

输入：derived = [1,1]
输出：true
解释：能够派生得到 [1,1] 的有效原始二进制数组是 [0,1] ：
derived[0] = original[0] ⊕ original[1] = 1
derived[1] = original[1] ⊕ original[0] = 1
示例 3：

输入：derived = [1,0]
输出：false
解释：不存在能够派生得到 [1,0] 的有效原始二进制数组。


提示：

n == derived.length
1 <= n <= 105
derived 中的值不是 0 就是 1 。
"""
from functools import reduce
from operator import xor
from typing import List


class Solution:
    def doesValidArrayExist(self, derived: List[int]) -> bool:
        dp = [0] * len(derived)
        for i in range(1,len(derived)):
            dp[i] = derived[i-1] ^ dp[i-1]
        return dp[-1]^dp[0] == derived[-1]
    def doesValidArrayExist_res1(self, derived: List[int]) -> bool:
        return reduce(xor, derived) == 0
    def doesValidArrayExist_res2(self, derived: List[int]) -> bool:
        return sum(derived) %2 == 0

if __name__ == '__main__':
    print(Solution().doesValidArrayExist([1,1,0]))
    print(Solution().doesValidArrayExist_res([1,1,0]))